table of contents
SEND(2) | Linux - příručka programátora | SEND(2) |
JMÉNO¶
send, sendto, sendmsg - pošli zprávu do soketu
SYNTAXE¶
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int s, const void *msg, size_t len,int flags );
ssize_t sendto(int s, const void
*msg, size_t len,int flags,
const struct sockaddr * to , socklen_t tolen
);
ssize_t sendmsg(int s, const struct msghdr *msg, int flags );
POPIS¶
Send() , sendto() , a sendmsg() se používají k zasílání zpráv do jiných soketů.
Send může být použito pouze, je-li soket spojený (takže je znám příjemce zprávy). Jediný rozdíl mezi send() a write(2) je přítomnost flagů. Pokud je proměnná flagy v send() je to ekvivalentní s voláním write(2). send(s,buf,len,flags) je ekvivalentní sendto(s,buf,len,flags, NULL,0).
Parametr s je deskriptor odesílajícího soketu.
Pokud je sendto() použito ve spojovaném módu (SOCK_STREAM, SOCK_SEQPACKET) jsou parametry to a tolen ignorovány(a chyba EISCONN může být vrácena, pokud nejsou NULL a 0) a chyba ENOTCONN je vrácena, pokud nebyl soket připojen. Jinak je adresa cíle dána v to a tolen specifikuje jeho velikost. Pro sendmsg() je adresa zadána pomocí msg.msg_name a msg.msg_namelen specifikuje jeho velikost.
Pro send() a sendto() je zpráva uložena v buf a má délku len Pro sendmsg() je zpráva indexována jednotlivými prvky pole msg.msg_iov. Volání sendmsg() umožňuje také posílat přidružená data (známá také jako kontrolní informace).
Pokud je zpráva příliš dlouhá na to, aby prošla atomicky skrze protokol nižší vrstvy, je vrácena chyba EMGSIZE a zpráva není poslána.
Funkce send neposkytuje žádnou možnost indikace správného doručení. Lokálně detekované chyby jsou indikovány návratovou hodnotou -1.
Pokud se zpráva nevejde do výstupního bufferu soketu, pak send() za běžných okolností tuto zprávu blokuje, pokud ovšem není nastaven neblokující I/O mód. V neblokujícím módu je v takovém případě vrácena hodnota EAGAIN Funkce select(2) může být zavolána, aby určila, kdy je možné zasílat další data.
Parametr flags je buď bitový, nulový nebo sestává z více následujících flagů.
- MSG_CONFIRM (pouze Linux 2.3+)
- Řekne linkové vrstvě, že nastal proces přeposlání: obdrželi jsme odpověď od druhé strany. Pokud toto linková vrstva nedostane, bude neustále cyklicky dotazovat souseda(například pomocí ARP). Platí pouze na SOCK_DGRAM a SOCK_RAW soketech a implementováno pouze pro IPv4 a IPv6. Pro více informací viz arp(7).
- MSG_DONTROUTE
- Nepoužívej bránu pro odesílání paketu do jiné sítě. Posílej pakety pouze hostům, kteří jsou přímo připojeni k síti. Toto nastavení je obvykle používáno pouze diagnostickými a směrovacími programy. Definováno pouze pro rodiny, které směrují. Paketové sokety nesměrují.
- MSG_DONTWAIT (od Linuxu 2.2)
- Umožňuje neblokující operace; pokud by operace blokovala je vráceno EAGAIN (Toto lze také povolit pomocí O_NONBLOCK v F_SETFL fnctl(2)).
- MSG_EOR (od Linuxu 2.2)
- Ukončí záznam (pokud je tento parametr podporován jako například u soketů SOCK_PAKET).
- MSG_MORE (od Linuxu 2.4.4)
- Volající má více dat k odeslání.
Tento flag je používán s TCP sokety ke
získání stejného efektu, jakého
dosahuje parametr soketu TCP_CORK (viz tcp(7)) s tím
rozdílem, že tento parametr může být
nastaven pro každé volání.
Od Linuxu 2.6 je tento parametr podporován také pro sokety UDP a informuje kernel, aby všechna data, která mají nastaven tento příznak, byla zabalena do jednoho datagramu, který je poslán, když je provedeno volání, které nemá tento flag nastaven. (Viz parametr UDP_CORK, který je popsán v udp(7).)
- MSG_NOSIGNAL (od Linuxu 2.2)
- Signál SIGPIPE nebude zaslán u proudově orientovaných soketů, když druhý konec ukončí spojení. Chyba EPIPE je však stále zasílána.
- MSG_OOB
- Posílá out-of-band data, pokud to daný soket
povoluje(např. SOCK_STREAM); protokol
nižší vrstvy musí také podporovat
out-of-band data.
Následuje definice msghdr struktury. Další detaily lze nalézt v recv(2) a níže.
- struct msghdr {
-
void *msg_name /*volitelná adresa*/
socklen_t msg_namelen; /*velikost adresy*/
struct iovec *msq_iov /*pole*/
size_t msg_iovlen /*členy msq_iov*/
void *msg_control /*pomocná data*/
socklen_t msg_controllen /*délka bufferu*/
int msg_flags /*parametry příchozí zprávy*/
};
Můžete poslat kontrolní informaci pomocí msg_control a msg_controllen. Maximální délka bufferu, kterou může kernel zpracovat je omezena pro každý soket pomocí net.core.opt-mem_max sysctl. Viz socket(7).
NÁVRATOVÁ HODNOTA¶
Volání vrací počet poslaných znaků, nebo -1 pokud se objevila chyba.
CHYBY¶
Toto jsou některé standardní chyby generované sokety. Nižší vrstvy však mohou generovat i jiné chyby. Pro jejich popis navštivte jejich manuálové stránky.
- EACCES
- (Pro unixové sokety, které jsou identifikovány pomocí cesty.) Právo zápisu je odmítnuto pro cílový soubor nebo právo na prohledávání je odmítnuto pro některý adresář v cestě. (Viz path_resolution(7).)
- EAGAIN
- nebo EWOULDBLOCK
Soket je označen jako neblokující a požadovaná operace by blokovala. - EBADF
- Byl specifikován neplatný deskriptor.
- ECONNRESET
-
Spojení resetováno druhou stranou. - EDESTADDRREQ
-
Soket se nenachází ve spojovaném módu a není nastavena žádná adresa. - EFAULT
- Parametr je v neplatné části adresového prostoru procesu.
- EINTR
- Objevil se signál dříve, než byla přenesena data. Viz signal(7).
- EINVAL
- Předán neplatný parametr.
- EISCONN
- Pro již spojený soket byl specifikován další adresát. (Buď je vyvolána tato chyba nebo je další adresát ignorován.)
- EMSGSIZE
- Soket požaduje, aby tato zpráva byla poslána atomicky, ale velikost této zprávy toto znemožňuje. ENOBUFS Výstupní fronta pro síťové rozhraní je zaplněna. To obvykle znamená, že rozhraní přestalo posílat, ale může to být také způsobeno občasným přetížením rozhraní.
- ENOMEM
- Žádná dostupná paměť.
- ENOTCONN
-
Soket není spojený a nebyl dán žádný cíl. - ENOTSOCK
- Argument s není soket.
- EOPNOTSUPP
-
Některý bit v parametrech je nevhodný pro tento typ soketu. - EPIPE
- Lokální spojení bylo ukončeno na spojovaném soketu. V tom případě proces také obdrží SIGPIPE pokud není nastaveno MSG_NOSIGNAL
SPLŇUJE STANDARDY¶
4.4BSD, SVr4, POSIX.1-2001 Tato volání se poprvé objevila ve 4.2BSD.
POSIX.1-2001 popisuje pouze příznaky MSG_OOB a MSG_EOR. Příznak MSG_CONFIRM je dostupný pouze v Linuxu.
POZNÁMKY¶
Prototypy uvedené výše splňují Single Unix Specifikaci a glibc2 také. Parametr flags byl typu int v BSD 4.x, ovšem unsigned int v libc4 a libc5. Argument len byl v BSD 4.x a libc 4 int , ovšem v libc5 je typu size_t argument tolen je typu int v 4.x BSD, libc4 i libc5. Viz accept(2).
Dle normy POSIX.1-2001 pole msg_controllen ve struktuře maghdr by mělo být typu socklen_t , ale v aktuální verzi glibc(2.4) má typ size_t
CHYBY¶
Linux by měl vrace EPIPE místo ENOTCONN.
PŘÍKLAD¶
Příklad použití sendto() je v getaddrinfo(3).
DALŠÍ INFORMACE¶
fcntl(2), sendfile(2), shutdown(2), recv(2), select(2), getsockopt(2), socket(2), write(2), cmsg(3), ip(7), socket(7), tcp(7), udp(7)
TIRÁŽ¶
Tato stránka je součástí projektu Linux man-pages. Popis projektu a informace o hlášení chyb najdete na http://www.kernel.org/doc/man-pages/.
5 října 2009 | BSD Man Page |